import _ from 'lodash';
/**
 * @desc 根据日期范围格式化提起具体时间，输出格式 yyyy-MM-dd HH:mm
 * @param range
 * @return {string}
 * ******************计算规则**********************
 * 近一天：今天 + 1,且时间是23:59:59
 * 近三天：今天 + 3,且时间是23:59:59
 * 近七天：今天 + 7,且时间是23:59:59
 * ...
 */
function handleZxTime(range) {
    let result = '';
    let format = 'yyyy-MM-dd';
    let curr_day = getCurrentTime('yyyyMMdd');
    result = addDays(curr_day, range, format);
    result += ' 23:59:59';

    return result;
}

/**
 * 判断一个对象是否为日期类型
 * @param obj 要判断的对象
 */
function isDate (obj) {
    return obj && type(obj) === 'date' ? true : false;
}

/**
 * 在指定日期下添加(减少)天数
 * @param date 指定日期(日期类型)
 * @param amount 数量(添加天数用正数，减少天数用负数)
 * @param outFmt 输出字符串格式，如果为空则返回日期类型
 * @returns 计算后的日期
 */
function addDays (date, amount, outFmt) {
    if (isDate(date)) {
        var time = date.getTime();
        var dtime = amount * 24 * 60 * 60 * 1000;
        time += dtime;
        date.setTime(time);
        if (outFmt) {
            return date;
        } else {
            return formatDate(date, outFmt);
        }
    } else {
        return date;
    }
}

/**
 * 格式化日期成一个字符串
 * @param data 日期
 * @param fmt 格式化字符串
 *            "yyyy-MM-dd hh:mm:ss.S"==>2006-07-02 08:09:04.423
 *            "yyyy-MM-dd E HH:mm:ss"==>2009-03-10 二 20:09:04
 *            "yyyy-MM-dd EE HH:mm:ss"==>2009-03-10 周二 20:09:04
 *            "yyyy-MM-dd EEE HH:mm:ss"==>2009-03-10 星期二 20:09:04
 *            "yyyy-M-d h:m:s.S"==>2006-7-2 8:9:4.18
 * @returns 格式化后的字符串
 */
function formatDate (date, fmt) {
    if (!isDate(date)) return;
    var o = {
        "M+": date.getMonth() + 1,
        // 月份
        "d+": date.getDate(),
        // 日
        "h+": date.getHours() % 12 == 0 ? 12 : date.getHours() % 12,
        // 小时
        "H+": date.getHours(),
        // 小时
        "m+": date.getMinutes(),
        // 分
        "s+": date.getSeconds(),
        // 秒
        "q+": Math.floor((date.getMonth() + 3) / 3),
        // 季度
        "S": date.getMilliseconds()
        // 毫秒
    };
    var week = {
        "0": "日",
        "1": "一",
        "2": "二",
        "3": "三",
        "4": "四",
        "5": "五",
        "6": "六"
    };
    if (/(y+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4
            - RegExp.$1.length));
    }
    if (/(E+)/.test(fmt)) {
        fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1)
            ? (RegExp.$1.length > 2 ? "星期" : "周")
            : "")
            + week[date.getDay() + ""]);
    }
    for (var k in o) {
        if (new RegExp("(" + k + ")").test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1)
                ? (o[k])
                : (("00" + o[k]).substr(("" + o[k]).length)));
        }
    }
    return fmt;
}

/**
 * 将一个字符串格式化成特定的格式日期字符串
 * @param str 要格式化的字符串(默认yyyyMMddHHmmss,如果特殊格式请指定inFmt)
 * @param outFmt 格式化输出的字符串
 * @param inFmt  原本字符串日期格式
 * @returns 格式化后的字符串
 */
function formatDateStr (str, fmt, inFmt) {
    if (str) {
        str = getNumberString(str);
        inFmt = inFmt ? inFmt : "yyyyMMddHHmmss".substring(0, str.length);
        var date = strToDate(str, inFmt);
        return formatDate(date, fmt);
    } else if (isDate(str)) {
        return formatDate(str, fmt);
    } else {
        return str;
    }
}

/**
 * 将一个日期或日期字符串格式化成纯数字，并获取前几位
 * @param date 日期字符串或日期
 * @param length 长度(前多少位)
 * @returns 格式化后的字符串
 */
function getNumberString (date, length) {
    if (isDate(date)) {
        let time = formatDate(date, "yyyyMMddHHmmss");
        if (_.isEmpty(length)) {
            return time;
        } else {
            return time.substring(0, length);
        }
    } else if (date) {
        let time = date.replaceAll("年", "").replaceAll("月", "").replaceAll("日",
            "").replaceAll("时", "").replaceAll("分", "").replaceAll("秒", "")
            .replaceAll("-", "").replaceAll(":", "").replaceAll("/", "")
            .replaceAll("\\.", "").replaceAll(" ", "").replaceAll("　", "").replaceAll("T", "");
        if (time.indexOf("+")!=-1){
            time = time.substring(0,time.indexOf("+"));
        }
        if (_.isEmpty(length)) {
            return time;
        } else {
            return time.substring(0, length);
        }
    } else {
        return date;
    }
}

/**
 * 字符串转换成日期类型
 * @param 要格式化的字符串(默认yyyyMMddHHmmss,如果特殊格式请指定inFmt)
 * @param inFmt  原本字符串日期格式
 * @returns 格式化后的日期(日期类型)
 */
function strToDate (str, inFmt) {
    if (str) {
        inFmt = inFmt ? inFmt : "yyyyMMddHHmmss";
        var date = new Date();

        // 获取年
        var yearStart = inFmt.indexOf("y");
        var yearEnd = inFmt.lastIndexOf("y");
        var year = str.substring(yearStart, yearEnd + 1);
        year && date.setYear(parseInt(year));

        // 获取月
        var monthStart = inFmt.indexOf("M");
        var monthEnd = inFmt.lastIndexOf("M");
        var month = str.substring(monthStart, monthEnd + 1);
        // bug:如果今天比转换月份最大天数大，会转换出错
        // month && date.setMonth(parseInt(month)-1);
        if (month) {
            // 获取当前月中的天数
            var nowDay = date.getDate();
            // 获取待转换月份天数
            var dayInMonths = getDaysInMonth(year, parseInt(month));
            // 如果当前月中天数大于待转换月份天数，转换月份天数设置为本月最后一天
            if (nowDay > dayInMonths) {
                date.setDate(dayInMonths);
            }
            date.setMonth(parseInt(month) - 1);
        }

        // 获取日
        var dayStart = inFmt.indexOf("d");
        var dayEnd = inFmt.lastIndexOf("d");
        var day = str.substring(dayStart, dayEnd + 1);
        day && date.setDate(parseInt(day));

        // 获取时
        var hourStart = inFmt.indexOf("H");
        var hourEnd = inFmt.lastIndexOf("H");
        var hour = str.substring(hourStart, hourEnd + 1);
        hour && date.setHours(parseInt(hour));

        // 获取分
        var minStart = inFmt.indexOf("m");
        var minEnd = inFmt.lastIndexOf("m");
        var min = str.substring(minStart, minEnd + 1);
        min && date.setMinutes(parseInt(min));

        // 获取秒
        var secondStart = inFmt.indexOf("s");
        var secondEnd = inFmt.lastIndexOf("s");
        var second = str.substring(secondStart, secondEnd + 1);
        second && date.setSeconds(parseInt(second));

        return date;
    } else {
        return str;
    }
}

/**
 * 获取某一年某一月是有多少天
 * @param year 年
 * @param month 月
 * @returns 天数
 */
function getDaysInMonth (year, month) {
    month = parseInt(month, 10);
    var monthStartDate = new Date(year, month - 1, 1);
    var monthEndDate = new Date(year, month, 1);
    var days = (monthEndDate.getTime() - monthStartDate.getTime()) / (1000 * 60 * 60 * 24);
    return days;
}

function type (obj) {
    var type = $.type(obj);
    return type.toLowerCase();
}

/**
 * 获取当前时间
 * @param fmt  日期格式(默认yyyyMMddHHmmss)
 * @returns 格式化后的字符串
 */
function getCurrentTime (fmt) {
    var pattern = fmt ? fmt : "yyyyMMddHHmmss";
    return formatDate(new Date(), pattern);
}

export {
    handleZxTime,
    formatDateStr
}